/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Bdd;

import java.sql.*;
import java.util.ArrayList;
import Metier.Vip;

/**
 *
 * @author kazanova
 */
public class VipRepository extends Repository {
    //////////////////////
    // Attributs privés //
    //////////////////////

    ///////////////////
    // Constructeurs //
    ///////////////////
    // Implémenté dans la classe Repository //
    ////////////////////////
    // Methodes publiques //
    ////////////////////////
    // Chargement de toutes les données
    public ArrayList loadAll() {
        System.out.println("Tentative de chargement de tous les Vip");
        ArrayList<Metier.Vip> list = new ArrayList<Metier.Vip>();
        openConnection();
        try {
            java.sql.ResultSet ensresul = stmt.executeQuery("SELECT * FROM ViewVip");
            while (ensresul.next()) {
                list.add(new Metier.Vip(
                        ensresul.getInt(1), // id
                        ensresul.getString(2), // nom
                        ensresul.getString(3), // prenom 1
                        ensresul.getString(4), // prenom 2
                        ensresul.getString(5), // prenom 3
                        ensresul.getDate(6), // DateNaiss
                        ensresul.getString(7), // LieuNaiss
                        ensresul.getString(8), // Nationalite
                        ensresul.getBoolean(9), // sexe
                        ensresul.getBoolean(10)) // Celib
                        );
            }
            ensresul.close();
            closeConnection();
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupération donnée" + e);
        }
        System.out.println("Fin chargement Vip");
        return list;
    }

    public Metier.Vip loadById(int id) {
        System.out.println("Tentative de recupération du Vip avec l'id " + id);
        ResultSet result = null;
        Metier.Vip objResult;
        try {
            openConnection();
            result = stmt.executeQuery("select * from ViewVip where id='" + id + "'");
            result.next();
            objResult = new Metier.Vip(
                    result.getInt(1), // id
                    result.getString(2), // nom
                    result.getString(3), // prenom 1
                    result.getString(4), // prenom 2
                    result.getString(5), // prenom 3
                    result.getDate(6), // DateNaiss
                    result.getString(7), // LieuNaiss
                    result.getString(8), // Nationalite
                    result.getBoolean(9), // sexe
                    result.getBoolean(10)); // Celib
            result.close();
            closeConnection();

        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return null;
        }
        System.out.println("Recupération Vip ok (" + objResult.getPrenom1() + " " + objResult.getNom() + " "+ objResult.getDate_naiss()+")");
        return objResult;
    }

    public int isObjectExist(Object obj) {
        if (obj.getClass() != Vip.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Vip");
            return -1;
        }
        Vip objVip = (Vip) obj;
        ResultSet result = null;
        int idObject = -1;
        int nbObject = 0;
        System.out.println("Recherche existance de Vip avec pour valeur " + objVip.toString());
        try {
            openConnection();
            // Création de la requete de comparaison de données //
            dataBaseConnection.setAutoCommit(false);
            stmtPr = dataBaseConnection.prepareStatement("select id from ViewVip where nom=? AND prenom1=? AND prenom2=? AND prenom3=? AND dateNaiss=? AND lieuNaiss=? AND Nationalite=? AND sexe=? AND celib=?");
            stmtPr.setString(1, objVip.getNom());
            stmtPr.setString(2, objVip.getPrenom1());
            stmtPr.setString(3, objVip.getPrenom2());
            stmtPr.setString(4, objVip.getPrenom3());
            stmtPr.setDate(5, objVip.getDate_naiss());
            stmtPr.setString(6, objVip.getLieu_naiss());
            stmtPr.setString(7, objVip.getNationalite());
            stmtPr.setBoolean(8, objVip.getSexe());
            stmtPr.setBoolean(9, objVip.getCelib());
            result = stmtPr.executeQuery();
            dataBaseConnection.commit();
            
            result.last();
            nbObject = result.getRow();
            result.beforeFirst();
            System.out.println(nbObject+" objets trouvés");
            if(nbObject>0) {
                result.first();
                idObject = result.getInt(1);
                if (nbObject > 1) {
                    System.out.println("WARNING ! Plusieurs Vip existe avec la même valeur");
                } else {
                    System.out.println("Vip unique trouvée");
                }
                // On retourne la valeur de l'id //
                System.out.println("Recupération de l'id de ce Vip");
                result.close();
                stmtPr.close();
                closeConnection();
                return idObject;
            }
            else {
                result.close();
                stmtPr.close();
                closeConnection();
                return -1;
            }
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return -1;
        }
    }

    public boolean isIdExist(int id) {
        ResultSet result = null;
        ArrayList<Integer> fina = new ArrayList<Integer>();
        System.out.println("Recherche existance de Vip avec id=" + id);
        try {
            openConnection();
            result = stmt.executeQuery("select count(id) from Vip where id='" + id + "'");
            System.out.println("Verification existance Vip id=" + id);
            int count;
            while (result.next()) {
                count = result.getInt(1);
                fina.add(count);
            }
            result.close();
            closeConnection();
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return false;
        }
        // Si il existe un nombre de resultat different de 1 //
        if (fina.size() != 1) {
            // Erreur SQL plusieurs vip avec le même id //
            System.out.println("ERROR ! Plusieurs Vip existe avec cet id");
            return true;
        }
        if (fina.get(0) != 0) {
            System.out.println("Vip unique trouvée");
            return true;
        }
        return false;
    }

    ////////////////////////////
    // Methodes supp pour Vip //
    ////////////////////////////
    public ArrayList<Metier.Vip> loadAllCelib() {
        System.out.println("Tentative de chargement de tous les Vip célibataires");
        ArrayList<Metier.Vip> listVip = new ArrayList();
        openConnection();
        try {
            java.sql.ResultSet ensresul = stmt.executeQuery("SELECT * FROM ViewVip where celib='1'");
            while (ensresul.next()) {
                listVip.add(new Metier.Vip(
                        ensresul.getInt(1), // id
                        ensresul.getString(2), // nom
                        ensresul.getString(3), // prenom 1
                        ensresul.getString(4), // prenom 2
                        ensresul.getString(5), // prenom 3
                        ensresul.getDate(6), // DateNaiss
                        ensresul.getString(7), // LieuNaiss
                        ensresul.getString(8), // Nationalite
                        ensresul.getBoolean(9), // sexe
                        ensresul.getBoolean(10)) // Celib
                        );
            }
            ensresul.close();
            closeConnection();
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupVip" + e);
            return null;
        }
        System.out.println("Fin chargement Vip celibataire");
        return listVip;
    }

    public ArrayList<Metier.Vip> loadAllMaries() {
        System.out.println("Tentative de chargement de tous les Vip mariés");
        ArrayList<Metier.Vip> listVip = new ArrayList();
        try {
            openConnection();
            java.sql.ResultSet ensresul = stmt.executeQuery("SELECT * FROM ViewVip where celib='0'");
            while (ensresul.next()) {
                listVip.add(new Metier.Vip(
                        ensresul.getInt(1), // id
                        ensresul.getString(2), // nom
                        ensresul.getString(3), // prenom 1
                        ensresul.getString(4), // prenom 2
                        ensresul.getString(5), // prenom 3
                        ensresul.getDate(6), // DateNaiss
                        ensresul.getString(7), // LieuNaiss
                        ensresul.getString(8), // Nationalite
                        ensresul.getBoolean(9), // sexe
                        ensresul.getBoolean(10)) // Celib
                        );
            }
            ensresul.close();
            closeConnection();
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupVip" + e);
            return null;
        }
        System.out.println("Fin chargement Vip mariés");
        return listVip;
    }

    public Vip getConjoint(Vip vip) {
        try {
            openConnection();
            java.sql.ResultSet ensresul = stmt.executeQuery("select * from ViewVip,Mariage where (Mariage.Vip_id=ViewVip.id AND Mariage.Vip_id2='"+vip.getId()+"') OR (ViewVip.id=Mariage.Vip_id2 AND Mariage.Vip_id='"+vip.getId()+"')");
            ensresul.first();
            int nbObject = ensresul.getRow();
            ensresul.last();
            if(nbObject>0) {
                System.out.println("Conjoint trouvé");
                Metier.Vip vip2;
                vip2 = new Metier.Vip(ensresul.getInt(1), // id
                        ensresul.getString(2), // nom
                        ensresul.getString(3), // prenom 1
                        ensresul.getString(4), // prenom 2
                        ensresul.getString(5), // prenom 3
                        ensresul.getDate(6), // DateNaiss
                        ensresul.getString(7), // LieuNaiss
                        ensresul.getString(8), // Nationalite
                        ensresul.getBoolean(9), // sexe
                        ensresul.getBoolean(10) // Celib
                        );
                return vip2;
            }
            System.out.println("Aucun Conjoint trouvé !");
            ensresul.close();
            closeConnection();
            return null;
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupVip" + e);
            return null;
        }
        
    }

    public int insertObject(Object obj) {
        if(obj.getClass() != Metier.Vip.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Vip");
            return -1;
        }
        Metier.Vip objVip = (Metier.Vip)obj;

        System.out.println("Tentative insertion de "+objVip.toString());
        // Recherche de l'existance d'un objet Vip //
        if(isObjectExist(obj)!=-1) {
            System.out.println("L'objet \""+objVip.toString()+"\" existe déjà");
            return INSERT_ERROR_EXIST;
        }
        else {
            System.out.println("Aucun vip n'existe");
        }
        ////////////////////////////////////////////////////////////
        // L'objet n'est pas déjà présent, insertion d'un nouveau //
        ////////////////////////////////////////////////////////////

        // GESTION DE LA NATIONALITE //
        String objNat = objVip.getNationalite();
        System.out.println("Tentative insertion de la nationalite : "+objNat);
        // Recherche de l'existance d'un objet
        NationaliteRepository natRepo = new NationaliteRepository();
        if(natRepo.insertObject(objNat)) {
            // Objet deja present
            int idNat = natRepo.isObjectExist(objNat);
            java.sql.Date objDate = objVip.getDate_naiss();
            try {
                openConnection();
                stmt.executeUpdate("insert into Vip (nom,prenom1,prenom2,prenom3,dateNaiss,lieuNaiss,Nat_id,sexe,celib) values('"+objVip.getNom()+"','"+objVip.getPrenom1()+"','"+objVip.getPrenom2()+"','"+objVip.getPrenom3()+"','"+formatSql.format(objDate)+"','"+objVip.getLieu_naiss()+"','"+idNat+"','"+(objVip.getSexe()?1:0)+"','"+(objVip.getCelib()?1:0)+"') ");
                closeConnection();
                return INSERT_OK;

            } catch (java.sql.SQLException e) {
                closeConnection();
                System.err.println("Probleme execution requete "+e);
                return -1;
            }
        }
        else {
            System.out.println("Erreur nationalite");
            return -1;
        }
    }
}
